/**
 * 什么叫双指针？
 * 
双指针是一种常用于解决数组和字符串问题的算法技巧。它基本上是使用两个指针来追踪数组或字符串中的元素，以解决特定类型的问题。双指针通常分为两种类型：

快慢指针：在这种情况下，两个指针从数组或字符串的某个位置开始，然后以不同的速度移动。通常，快指针会移动得更快，而慢指针会移动得更慢。这种方法通常用于解决一些搜索或判断问题，如判断链表是否有环、找到链表的中间节点等。

左右指针：在这种情况下，两个指针分别从数组或字符串的两端开始，然后向中间移动。左指针向右移动，而右指针向左移动。这种方法通常用于解决一些查找或搜索问题，如在有序数组中查找特定元素、判断是否存在两个元素的和等于目标值等
 */

/**
 * 快慢指针示例
 */
var removeElement = function(nums, val) {
    
    const n = nums.length;
    // 左指针
    let left = 0;
    // 右指针 快指针出发
    for (let right = 0; right < n; right++) {
        /** 不等于 指定值 慢指针也出发 */
        if (nums[right] !== val) {
            nums[left] = nums[right];
            left++;
        }
        // 等于指定值，快指针继续，到又不等时 慢指针的值直接越过不等的被指定，相当于删除等于指定值的位置
    }
    return left;
};

/**
 * 左右指针
 * @param {*} nums 
 * @param {*} val 
 * @returns 
 */
var removeElement = function(nums, val) {
    let left = 0, right = nums.length;
    while (left < right) {
        if (nums[left] === val) {
            nums[left] = nums[right - 1];
            right--;
        } else {
            left++;
        }
    }
    return left;
};

